package com.ntd.study.base.classe;

import cn.hutool.core.lang.Console;

/**
 * java类特性学习
 * 面向对象：关注于功能实现的行为
 * 面向过程：关注于功能实现的步骤
 * 四个基本特征：抽象、封装、继承、多态
 * |--抽象：接口和抽象类是其具体体现-抽象出来一批对象的共有特征
 * |--多态：重载和重写是其具体体现-就是同一个操作根据不同的场景会展示出来不一样的状态
 * 抽象类和接口的区别
 * |--相同点：都是上层抽象、都不能实例化、都包含抽象方法
 * |--不同点：抽象类包含非抽象方法、接口中包含默认方法（jdk1.8)、抽象类只能继承一个、接口可以实现多个
 */
public class Class {
    String test1; // 默认 同包可见
    private String test2; // 常用 同类可见（也叫私有化）
    protected String test3; // 同包可见,子类可见 常用于jar封装
    public String test4; // 公开的 全局可见 可使用

    public static void main(String[] args) {

    }

    interface IAnimal { // 接口-动物-抽象出来的共有特征
        void run(); // 动物运动

        void eat(); // 吃东西

        default void die() { // 默认方法（jdk1.8）
            playDie();
        }

        private void playDie() { // 私有方法（jdk1.9）-主要是提供给默认方法适用
            Console.log("死亡");
        }
    }

    abstract class Animal implements IAnimal { // 对象-动物-实现类IAnimal接口，还可以实现其他接口，拥有更多的特性
        @Override
        public void run() { // 实例方法-实现了接口里面的方法
            Console.log("动物每秒运动100M");
        }

        @Override
        public abstract void eat(); // 抽象方法
    }

    class Dog extends Animal { // 对象-狗-继承了Animal对象
        @Override
        public void run() { // 方法重写-重写父类方法，有自己的方法特性
            Console.log("狗每秒运动1M");
        }

        @Override
        public void eat() { // 方法实现-实现了抽象类里面的吃方法
            Console.log("狗吃骨头");
        }

        public void eat(String good) { // 方法重载-根据传入的参数不同能够产生不同的效果
            Console.log("狗吃" + good);
        }
    }
}

